
#ifndef _DRIVER_GPIO_H
#define _DRIVER_GPIO_H

#include "stdint.h"
#include "gd32f30x.h"

#define  LED_STATE_ON()            gpio_bit_reset(GPIOB, userHdl.param.led_num)
#define  LED_STATE_OFF()           gpio_bit_set(GPIOB, userHdl.param.led_num)


typedef enum
{
	IN_ELE_POS_X1 = 0,
	IN_ELE_POS_X2,
	IN_CHARGE_STATUS,
	
	OUT_LED1_BOARD,
	OUT_LED2_BOARD,
	OUT_LED3_EXTERN,
	
	OUT_BUZZER,
	
	OUT_RELAY_CHARGE,
	OUT_RELAY_HOLD,
	
	OUT_WASTE_PUMP,
	
	OUT_ACTUATE_X1,
	OUT_ACTUATE_X2,
	
	GPIO_NUM_ALL
	
}ENUM_USER_GPIO;



typedef enum
{
	GPIO_INPUT,
	GPIO_OUTPUT

}ENUM_GPIO_DIR;


typedef struct
{
	uint32_t num_group;
	uint32_t num_pin;
	ENUM_GPIO_DIR  direction;

}STR_USER_GPIO;






// ====================== output =====================================

// turn LED ctrl
#define  LED_LEFT_OFF()               gpio_bit_reset(GPIOE, GPIO_PIN_2)
#define  LED_LEFT_ON()                gpio_bit_set(GPIOE, GPIO_PIN_2)

#define  LED_RIGHT_OFF()              gpio_bit_reset(GPIOE, GPIO_PIN_3)
#define  LED_RIGHT_ON()               gpio_bit_set(GPIOE, GPIO_PIN_3)

// RS485 driection control
#define  EN_RS485_UART1_TRAN()        gpio_bit_set(GPIOD, GPIO_PIN_4)
#define  EN_RS485_UART1_RECE()        gpio_bit_reset(GPIOD, GPIO_PIN_4)

#define  EN_POWER_HOLD()              gpio_bit_set(GPIOG, GPIO_PIN_9)
#define  DIS_POWER_HOLD()             gpio_bit_reset(GPIOG, GPIO_PIN_9)

#define  EN_POWER_12V_PERIPHERAL()    gpio_bit_set(GPIOE, GPIO_PIN_4)
#define  DIS_POWER_12V_PERIPHERAL()   gpio_bit_reset(GPIOE, GPIO_PIN_4)

#define  EN_POWER_12V_MAIN_BOARD()    gpio_bit_set(GPIOG, GPIO_PIN_7)
#define  DIS_POWER_12V_MAIN_BOARD()   gpio_bit_reset(GPIOG, GPIO_PIN_7)

#define  EN_POWER_5V_ULTRASOUND()     gpio_bit_set(GPIOG, GPIO_PIN_2)
#define  DIS_POWER_5V_ULTRASOUND()    gpio_bit_reset(GPIOG, GPIO_PIN_2)

#define  EN_POWER_SWITCH_CLEAN()      gpio_bit_set(GPIOE, GPIO_PIN_7)
#define  DIS_POWER_SWITCH_CLEAN()     gpio_bit_reset(GPIOE, GPIO_PIN_7)

#define  EN_POWER_HOLD_CLEAN()        gpio_bit_set(GPIOE, GPIO_PIN_8)
#define  DIS_POWER_HOLD_CLEAN()       gpio_bit_reset(GPIOE, GPIO_PIN_8)

#define  EN_PRECHARGE_CLEAN()         gpio_bit_set(GPIOE, GPIO_PIN_10)
#define  DIS_PRECHARGE_CLEAN()        gpio_bit_reset(GPIOE, GPIO_PIN_10)

#define  EN_CHARGE_SWITCH_AUTO()      gpio_bit_set(GPIOF, GPIO_PIN_13)
#define  DIS_CHARGE_SWITCH_AUTO()     gpio_bit_reset(GPIOF, GPIO_PIN_13)

#define  EN_CHARGE_HOLD_AUTO()        gpio_bit_set(GPIOF, GPIO_PIN_14)
#define  DIS_CHARGE_HOLD_AUTO()       gpio_bit_reset(GPIOF, GPIO_PIN_14)

#define  EN_CHARGE_SERVICE()          gpio_bit_set(GPIOG, GPIO_PIN_8)
#define  DIS_CHARGE_SERVICE()         gpio_bit_reset(GPIOG, GPIO_PIN_8)

#define  EN_POWER_MOTOR_SERVICE()     gpio_bit_set(GPIOF, GPIO_PIN_15)
#define  DIS_POWER_MOTOR_SERVICE()    gpio_bit_reset(GPIOF, GPIO_PIN_15)


// ======================= input ======================================

// BUMPER status
#define  READ_BUMPER_X1_INPUT()          gpio_input_bit_get(GPIOG,GPIO_PIN_0)
#define  READ_BUMPER_X2_INPUT()          gpio_input_bit_get(GPIOG,GPIO_PIN_1)

// Break key status
#define  READ_BREAK_INPUT()              gpio_input_bit_get(GPIOG,GPIO_PIN_6)

// Start key status
#define  READ_START_KEY_INPUT()          gpio_input_bit_get(GPIOG,GPIO_PIN_14)

// Power key status
#define  READ_POWER_KEY_INPUT()          gpio_input_bit_get(GPIOG,GPIO_PIN_5)

// charge status (seriver robot)
#define  CHARGE_SERVICE_STATUS_READ()    gpio_input_bit_get(GPIOE,GPIO_PIN_5)

// charge status (clean robot)
#define  CHARGE_CLEAN_STATUS_READ()      gpio_input_bit_get(GPIOG,GPIO_PIN_13)

// power 12V status 
#define  POWER_12V_STATUS_READ()         gpio_input_bit_get(GPIOG,GPIO_PIN_15)



extern void heartbeat_led_init(uint16_t version_num);
extern void general_gpio_init(void);


extern void user_gpio_init(void);
extern void set_gpio_output(STR_USER_GPIO *gpioHdl, FlagStatus level);
extern FlagStatus get_gpio_input(STR_USER_GPIO *gpioHdl);

extern STR_USER_GPIO userGPIO[GPIO_NUM_ALL];

#endif

